﻿import type { RequestOptions } from '@@/plugin-request/request';
import { type RequestConfig } from '@umijs/max';
import { HEADER_FIELD_AUTH } from './models/constant';

// 错误处理方案： 错误类型
enum ECode {
  OK = 0,

  PARAMS_400 = 40000,
  NOT_LOGIN_401 = 40100,
  NOT_AUTH_401 = 40101,
  FORBIDDEN_403 = 40300,
  NOT_FOUND_404 = 40400,

  SYSTEM_500 = 50000,
  OPERATION_500 = 50001,
}
// 与后端约定的响应数据格式
// interface ResponseStructure {
//   success: boolean;
//   data: any;
//   code?:number;
//   errorCode?: number;
//   errorMessage?: string;
//   showType?: ErrorShowType;
// }
interface ResponseStructure {
  code: number;
  data: any;
  message? : string;
}


/**
 * @name 错误处理   (+请求、响应拦截处理)
 * pro 自带的错误处理， 可以在这里做自己的改动
 * @doc https://umijs.org/docs/max/request#配置
 */
export const netConfig: RequestConfig = {
  // 错误处理： umi@3 的错误处理方案。
  errorConfig: {
    // 错误抛出
    errorThrower: (res) => {
      const { code, data, message} =
        res as unknown as ResponseStructure;
      if (code !== 0) {
        const error: any = new Error(message);
        error.name = 'BizError';
        error.info = { code, message, data };

        console.debug("errorThrower");
        console.debug(JSON.stringify(error));

        throw error; // 抛出自制的错误
      }
    },
    //错误接收及处理
    // errorHandler: (error: any, opts: any) => {
    //   if (opts?.skipErrorHandler) throw error;
    //   // 我们的 errorThrower 抛出的错误。
    //   if (error.name === 'BizError') {
    //     const errorInfo: ResponseStructure | undefined = error.info;
    //     if (errorInfo) {
    //       switch (errorInfo.code) {
    //         case ECode.NOT_LOGIN_401:
    //           // TODO： 跳转登录页
    //           ToLogin();
    //           break;
    //         default:
    //           throw error;
    //       }
    //     }
    //   } else if (error.response) {
    //     // Axios 的错误
    //     // 请求成功发出且服务器也响应了状态码，但状态代码超出了 2xx 的范围
    //     // message.error(`Response status:${error.response.status}`);
    //     throw error;
    //   } else if (error.request) {
    //     // 请求已经成功发起，但没有收到响应
    //     // \`error.request\` 在浏览器中是 XMLHttpRequest 的实例，
    //     // 而在node.js中是 http.ClientRequest 的实例
    //     // message.error(`None response: ${error}`);
    //     throw error;
    //   } else {
    //     // 发送请求时出了点问题
    //     // message.error(`Request error: ${error}`);
    //     throw error;
    //   }
    // },
  },



  // 请求拦截器
  requestInterceptors: [
    (config: RequestOptions) => {
      // 拦截请求配置，进行个性化处理。
      const userToken = localStorage.getItem('userToken');
      if(userToken) {
        config.headers = {
          ...config.headers,
          [HEADER_FIELD_AUTH] : userToken,
        }
      }
      return { ...config};
      // const url = config?.url?.concat('?token = 123');
      // return { ...config, url };
    },
  ],

  // 响应拦截器
  responseInterceptors: [
    (response) => {
      // 拦截响应数据，进行个性化处理
      const { data } = response as unknown as ResponseStructure;
      
      if (data?.code !== 0  ) {
        // throw new Error(data.message);
        const error: any = new Error(data.message);
        error.name = 'respError';
        error.info = { ...data };
        // console.debug(JSON.stringify(error));
        throw error;
      }
      
      return response;
      
    },
  ],
};
